﻿/*
 * 2023/5/10
 * SignalR的应用
 * 1、安装SignalR包：Microsoft.AspNetCore.SignalR.Common
 * 2、自定义一个类，继承Hub类
 *   描述：Hub（集线器）是一个抽象类，SignalR借助Hub，可以客户端自动创建代理对象。
 *   双向RPC,即可以直接从客户端调用服务器端的方法，同时服务端也可以调用客户端的方法
 *  
 *  1)得写它的两个方法（F12查看Hub，可以看到两个虚方法）：连接和断开连接
 *  2)写一个发送消息的方法
 * 3、客户端调用(VUE调用)
 *  1)安装插件  npm install @microsoft/signalr
 * **/
using Microsoft.AspNetCore.SignalR;

namespace Max.PH6_2009A.LowCode.API
{
    /// <summary>
    /// 
    /// </summary>
    public class SignalRChatHub :Hub
    {

        #region 发送消息
        /// <summary>
        /// 自定义发送方法
        /// </summary>
        /// <param name="user"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public async Task SendMessage(string user, string message)
        {
            #region Client
            //this.Context.ConnectionId                 //每个连接一个connectionId  表示唯一客户端
            //this.Clients.Client().SendAsync();        //指定发送消息
            //this.Clients.Clients()        
            #endregion             //给多个client发消息

            #region Group
            //this.Clients.Group();                     //给某个组发消息
            //this.Clients.Groups()                     //给多个组发消息
            //this.Groups.AddToGroupAsync()             //将指定连接加入组
            //this.Groups.RemoveFromGroupAsync()        //将指定连接移除组 
            #endregion

            //ReceiveMessage 为客户端方法，让所有客户端调用这个方法
            await Clients.All.SendAsync("ReceiveMessage", user, message);
        }
        #endregion

        #region 连接、断开

        /// <summary>
        /// 连接服务器
        /// </summary>
        /// <returns></returns>
        public override Task OnConnectedAsync()
        {
            System.Diagnostics.Trace.WriteLine($"{this.Context.ConnectionId} 客户连接成功");
            return base.OnConnectedAsync();
        }

        /// <summary>
        /// 和服务器断开连接
        /// </summary>
        /// <param name="exception"></param>
        /// <returns></returns>
        public override Task OnDisconnectedAsync(Exception? exception)
        {
            string connectionId = this.Context.ConnectionId;
            System.Diagnostics.Trace.WriteLine($"{connectionId} 客户连接终止");
            return base.OnDisconnectedAsync(exception);
        }
        #endregion

    }
}
